import Vue from 'vue'
import { login, logout, phoneLogin, thirdLogin } from "@/api/login"
import { ACCESS_TOKEN, USER_NAME, USER_INFO, USER_AUTH, SYS_BUTTON_AUTH, UI_CACHE_DB_DICT_DATA, TENANT_ID, CACHE_INCLUDED_ROUTES } from "@/store/mutation-types"
import { welcome } from "@/utils/util"
import { queryPermissionsByUser,clearUserPermissionByToken } from '@/api/api'
import { getAction } from '@/api/manage'

const user = {
    state: {
        token: '',
        username: '',
        realname: '',
        tenantid: '',
        welcome: '',
        avatar: '',
        permissionList: [],
        webPermissionList:[],
        info: {}
    },

    mutations: {
        SET_TOKEN: (state, token) => {
            state.token = token
        },
        SET_NAME: (state, { username, realname, welcome }) => {
            state.username = username
            state.realname = realname
            state.welcome = welcome
        },
        SET_AVATAR: (state, avatar) => {
            state.avatar = avatar
        },
        SET_PERMISSIONLIST: (state, permissionList) => {
            state.permissionList = permissionList
        },
        SET_WEBPERMISSIONLIST: (state, permissionList) => {
            state.webPermissionList = permissionList
        },
        SET_INFO: (state, info) => {
            state.info = info
        },
        SET_TENANT: (state, id) => {
            state.tenantid = id
        },
    },

    actions: {
        // CAS验证登录
        ValidateLogin({ commit }, userInfo) {
            return new Promise((resolve, reject) => {
                getAction("/sys/cas/client/validateLogin", userInfo).then(response => {
                    console.log("----cas 登录--------", response);
                    if (response.success) {
                        const result = response.result
                        const userInfo = result.userInfo
                        Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
                        commit('SET_TOKEN', result.token)
                        commit('SET_INFO', userInfo)
                        commit('SET_NAME', { username: userInfo.username, realname: userInfo.realname, welcome: welcome() })
                        commit('SET_AVATAR', userInfo.avatar)
                        Vue.ls.remove(USER_AUTH);
                        Vue.ls.remove(SYS_BUTTON_AUTH);
                        resolve(response)
                    } else {
                        resolve(response)
                    }
                }).catch(error => {
                    reject(error)
                })
            })
        },
        // 登录
        Login({ commit }, userInfo) {
            return new Promise((resolve, reject) => {
                login(userInfo).then(response => {
                    if (response.code == '200') {
                        const result = response.result
                        const userInfo = result.userInfo
                        Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(UI_CACHE_DB_DICT_DATA, result.sysAllDictItems, 7 * 24 * 60 * 60 * 1000)
                        commit('SET_TOKEN', result.token)
                        commit('SET_INFO', userInfo)
                        commit('SET_NAME', { username: userInfo.username, realname: userInfo.realname, welcome: welcome() })
                        commit('SET_AVATAR', userInfo.avatar)
                        Vue.ls.remove(USER_AUTH);
                        Vue.ls.remove(SYS_BUTTON_AUTH);
                        resolve(response)
                    } else {
                        reject(response)
                    }
                }).catch(error => {
                    reject(error)
                })
            })
        },
        //手机号登录
        PhoneLogin({ commit }, userInfo) {
            return new Promise((resolve, reject) => {
                phoneLogin(userInfo).then(response => {
                    if (response.code == '200') {
                        const result = response.result
                        const userInfo = result.userInfo
                        Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(UI_CACHE_DB_DICT_DATA, result.sysAllDictItems, 7 * 24 * 60 * 60 * 1000)
                        commit('SET_TOKEN', result.token)
                        commit('SET_INFO', userInfo)
                        commit('SET_NAME', { username: userInfo.username, realname: userInfo.realname, welcome: welcome() })
                        commit('SET_AVATAR', userInfo.avatar)
                        Vue.ls.remove(USER_AUTH);
                        Vue.ls.remove(SYS_BUTTON_AUTH);
                        resolve(response)
                    } else {
                        reject(response)
                    }
                }).catch(error => {
                    reject(error)
                })
            })
        },
        // 获取用户信息
        GetPermissionList({ commit }) {
            return new Promise((resolve, reject) => {
                console.info("user js queryPermissionsByUser start")
                queryPermissionsByUser().then(response => {
                    console.info("user js queryPermissionsByUser then")
                    console.log(response)
                    const menuData = response.result.menu;
                    const authData = response.result.auth;
                    const allAuthData = response.result.allAuth;
                    //Vue.ls.set(USER_AUTH,authData);
                    sessionStorage.setItem(USER_AUTH, JSON.stringify(authData));
                    sessionStorage.setItem(SYS_BUTTON_AUTH, JSON.stringify(allAuthData));
                    if (menuData && menuData.length > 0) {
                        //update--begin--autor:qinfeng-----date:20200109------for：JEECG-63 一级菜单的子菜单全部是隐藏路由，则一级菜单不显示------
                        menuData.forEach((item, index) => {
                                if (item["children"]) {
                                    let hasChildrenMenu = item["children"].filter((i) => {
                                        return !i.hidden || i.hidden == false
                                    })
                                    if (hasChildrenMenu == null || hasChildrenMenu.length == 0) {
                                        item["hidden"] = true
                                    }
                                }
                            })
                            //console.log(" menu show json ", menuData)
                            //update--end--autor:qinfeng-----date:20200109------for：JEECG-63 一级菜单的子菜单全部是隐藏路由，则一级菜单不显示------
                        commit('SET_PERMISSIONLIST', menuData)
                        console.info("user js queryPermissionsByUser end")
                    } else {
                        reject('getPermissionList: permissions must be a non-null array !')
                    }
                    resolve(response)
                }).catch(error => {
                    reject(error)
                })
            })
        },
        ClearPermissionList({ commit }){
          return new Promise((resolve, reject) => {
            clearUserPermissionByToken().then(response => {
              commit('SET_PERMISSIONLIST', [])        
              resolve(response)
            }).catch(error => {
                reject(error)
            })
          })
        },  
        GetWebPermissionList({ commit }) {
            return new Promise((resolve, reject) => {
                queryPermissionsByUser().then(response => {
                    console.log(response)
                    const menuData = response.result.menu;
                    const authData = response.result.auth;
                    const allAuthData = response.result.allAuth;
                  
                    Vue.ls.set(USER_AUTH,JSON.stringify(authData));
                    Vue.ls.set(SYS_BUTTON_AUTH, JSON.stringify(allAuthData));
                    commit('SET_WEBPERMISSIONLIST', authData.push(...allAuthData))
                    resolve(response)
                }).catch(error => {
                    reject(error)
                })
            })
        },    
        // 登出
        Logout({ commit, state }) {
            return new Promise((resolve) => {
                let logoutToken = state.token;
                commit('SET_TOKEN', '')
                commit('SET_PERMISSIONLIST', [])
                commit('SET_PERMISSIONLIST', [])
                Vue.ls.remove(ACCESS_TOKEN)
                Vue.ls.remove(USER_INFO)
                Vue.ls.remove(USER_NAME)
                Vue.ls.remove(UI_CACHE_DB_DICT_DATA)
                Vue.ls.remove(CACHE_INCLUDED_ROUTES)
                Vue.ls.remove(USER_AUTH);
                Vue.ls.remove(SYS_BUTTON_AUTH);
                    //console.log('logoutToken: '+ logoutToken)
                logout(logoutToken).then(() => {
                    if (process.env.VUE_APP_SSO == 'true') {
                        let sevice = 'http://' + window.location.host + '/'
                        let serviceUrl = encodeURIComponent(sevice)
                        window.location.href = process.env.VUE_APP_CAS_BASE_URL + '/logout?service=' + serviceUrl
                    }
                    resolve()
                }).catch(() => {
                    resolve()
                })
            })
        },
        // 第三方登录
        ThirdLogin({ commit }, param) {
            return new Promise((resolve, reject) => {
                thirdLogin(param.token, param.thirdType).then(response => {
                    if (response.code == '200') {
                        const result = response.result
                        const userInfo = result.userInfo
                        Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000)
                        Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
                        commit('SET_TOKEN', result.token)
                        commit('SET_INFO', userInfo)
                        commit('SET_NAME', { username: userInfo.username, realname: userInfo.realname, welcome: welcome() })
                        commit('SET_AVATAR', userInfo.avatar)
                        Vue.ls.remove(USER_AUTH);
                        Vue.ls.remove(SYS_BUTTON_AUTH);
                        resolve(response)
                    } else {
                        reject(response)
                    }
                }).catch(error => {
                    reject(error)
                })
            })
        },
        saveTenant({ commit }, id) {
            Vue.ls.set(TENANT_ID, id, 7 * 24 * 60 * 60 * 1000)
            commit('SET_TENANT', id)
        }


    }
}

export default user